package it.unipg.bipod.web;

import it.unipg.bipod.applicationLogic.*;
import it.unipg.bipod.dataModel.*;

/**
 * SegretarioCorsiBean gestisce le attivita' della segreteria collegate alla gestione dei corsi.<br>
 * Permette di consultare l'elenco dei corsi e di aggiungere o rimuovere corsi dalla base di dati.<br>
 * E' presente la sottoclasse pubblica CorsoBean.<br>
 * Eventuali messaggi o errori vengono segnalati mediante i metodi forniti da DefaultBean.
 * 
 * @author Lorenzo Porzi
 * @see DefaultBean
 * @see SegretarioBean
 */
public class SegretarioCorsiBean extends DefaultBean {
	private SegretarioApplication application;
	
	private CorsoBean[] corsi; // Elenco dei corsi
	private String nuovoCorso; // Nome del corso in fase di creazione
	
	/**
	 * Costruisce un SegretarioCorsiBean associato alla SegretarioApplication fornita.<br>
	 * Viene caricato immediatamente l'elenco dei corsi.
	 *  
	 * @param application la SegretarioApplication da associare a questo SegretarioCorsiBean.
	 */
	public SegretarioCorsiBean(SegretarioApplication application) {
		super();
		
		this.application = application;
		this.nuovoCorso = "";
		
		// Carica i corsi
		caricaCorsi();
	}
	
	/* ----------------------------------
	 * Setters e getters per le proprietà
	 * ---------------------------------- */
	
	/**
	 * Imposta il nome del corso in fase di creazione.
	 * 
	 * @param nuovoCorso il nome del corso che si sta creando.
	 */
	public void setNuovoCorso(String nuovoCorso) {
		this.nuovoCorso = nuovoCorso.trim();
	}

	/**
	 * @return il nome del corso in fase di creazione.
	 */
	public String getNuovoCorso() {
		return nuovoCorso;
	}
	
	/* --------------------------------
	 * Metodi per l'estrazione dei dati
	 * -------------------------------- */

	/**
	 * @return un array di {@link CorsoBean} con l'elenco dei corsi memorizzati nel database.
	 */
	public CorsoBean[] getCorsi() {
		return corsi;
	}
	
	/**
	 * @return il numero di corsi memorizzati nel database.
	 */
	public int getNumeroCorsi() {
		return corsi.length;
	}
	
	/* ---------------------
	 * Metodi di navigazione
	 * --------------------- */
	
	/**
	 * Crea un nuovo corso utilizzando il nome specificato nella proprieta' "nuovoCorso".<br>
	 * Questo metodo utilizza le seguenti proprieta' di presentation.ini:
	 * <ul>
	 *   <li><b>msgCorsoInserito</b>: il messaggio visualizzato quando l'inserimento ha successo.</li>
	 *   <li><b>msgErroreCorsoPresente</b>: il messaggio visualizzato quando si tenta di creare un corso
	 *   con lo stesso nome di un corso gia' esistente.</li>
	 *   <li><b>msgErroreCorso</b>: il messaggio visualizzato quando l'inserimento non riesce per cause sconosciute.</li>
	 * </ul>
	 */
	public void inserisciCorso() {
		try {
			application.nuovoCorso(nuovoCorso);
			
			// Ricarica i corsi
			caricaCorsi();
			nuovoCorso = "";
			
			// Messaggio di successo
			addInfoMessage(getSettings().getProperty("msgCorsoInserito"));
		} catch (StatoCorsoException e) { 
			addWarnMessage(getSettings().getProperty("msgErroreCorsoPresente"));
		} catch (ApplicationException e) {
			addWarnMessage(getSettings().getProperty("msgErroreCorso"));
		}
	}
	
	/* ------------
	 * Altri metodi
	 * ------------ */
	
	/**
	 * Carica i corsi dal database.<br>
	 * I metodi pubblica per la consultazione dell'elenco dei corsi in realtà non accedono direttamente
	 * al database, bensi' accedono ad una variabile locale il cui contenuto viene caricato da questo
	 * metodo. Le operazioni che causano un aggiornamento dell'elenco dei corsi devono chiamare questo
	 * metodo per aggiornare congruamente i dati.
	 */
	private void caricaCorsi() {
		try {
			Corso[] corsi = application.getCorsi();
			this.corsi = new CorsoBean[corsi.length];
			for (int i = 0; i < corsi.length; ++i)
				this.corsi[i] = new CorsoBean(corsi[i]);
			
		} catch (ApplicationException e) {
			CorsoBean[] vuoto = {};
			this.corsi = vuoto;
		}
	}
	
	/* -----------
	 * Sottoclassi
	 * ----------- */

	/**
	 * CorsoBean incapsula un corso aggiungendo un metodo di navigazione utile per la pagina
	 * di gestione corsi della segreteria.
	 * 
	 * @author Lorenzo Porzi
	 */
	public class CorsoBean {
		private Corso corso; // Il corso incapsulato
		
		/**
		 * Crea un CorsoBean che incapsula il corso specificato.
		 * 
		 * @param corso il corso da gestire con questo CorsoBean
		 */
		public CorsoBean(Corso corso) {
			this.corso = corso;
		}

		/**
		 * @return il nome del corso incapsulato.
		 */
		public String getNome() {
			return corso.getNome();
		}
		
		/**
		 * Cancella questo corso dalla base di dati.<br>
		 * Questo metodo utilizza le seguenti proprieta' di presentation.ini:
		 * <ul>
		 *   <li><b>msgCorsoCancellato</b>: il messaggio visualizzato quando la cancellazione ha successo.</li>
		 *   <li><b>msgErroreCorsoConInsegnamenti</b>: il messaggio visualizzato quando si tenta di cancellare un corso
		 *   al quale afferiscono degli insegnamenti.</li>
		 *   <li><b>msgErroreCorso</b>: il messaggio visualizzato quando la cancellazione non riesce per cause sconosciute.</li>
		 * </ul>
		 */
		public void cancella() {
			try {
				application.cancellaCorso(corso);
				
				// Ricarica i corsi
				caricaCorsi();
				
				// Messaggio di successo
				addInfoMessage(getSettings().getProperty("msgCorsoCancellato"));
			} catch (StatoCorsoException e) { 
				addWarnMessage(getSettings().getProperty("msgErroreCorsoConInsegnamenti"));
			} catch (ApplicationException e) {
				addWarnMessage(getSettings().getProperty("msgErroreCorso"));
			}
		}
	}
}
